/**
在 TypeScript 中，函数类型的调用签名（Call Signature）用于定义函数的参数和返回值类型。调用签名允许我们描述一个函数的结构，而不需要提供具体的实现。这对于类型检查和函数类型的复用非常有用。
  1. 调用签名的基本语法
  调用签名的基本格式如下：
  type 函数类型 = (参数名: 参数类型, ...) => 返回值类型;
  2. 示例

   2.1 基本调用签名

  定义一个函数类型  `AddFunction` ，它接受两个数字参数并返回一个数字：
  type AddFunction = (a: number, b: number) => number;

  const add: AddFunction = (x, y) => {
      return x + y;
  };
   2.2 可选参数的调用签名

  可以在调用签名中使用可选参数：
  type GreetFunction = (name: string, greeting?: string) => string;

  const greet: GreetFunction = (name, greeting) => {
      return greeting ? `${greeting}, ${name}!` : `Hello, ${name}!`;
  };
   2.3 默认参数的调用签名

  调用签名本身不能直接包含默认参数，但可以在实现时使用默认参数：
  type MultiplyFunction = (a: number, b?: number) => number;

  const multiply: MultiplyFunction = (a, b = 1) => {
      return a * b;
  };
   2.4 剩余参数的调用签名

  可以在调用签名中使用剩余参数：
  type SumFunction = (...numbers: number[]) => number;

  const sum: SumFunction = (...numbers) => {
      return numbers.reduce((acc, curr) => acc + curr, 0);
  };
  3. 函数类型作为参数
  调用签名可以用于定义函数类型作为参数的函数：
  type CallbackFunction = (input: string) => void;

  function processUserInput(callback: CallbackFunction) {
      const userInput = "Hello, TypeScript!";
      callback(userInput);
  }

  processUserInput((input) => {
      console.log(input); // 输出: Hello, TypeScript!
  });
  4. 结论
  函数类型的调用签名是 TypeScript 中一种非常重要的特性，它允许开发者定义函数的参数和返回值类型，而不需要提供具体的实现。通过使用调用签名，可以提高代码的可读性和可维护性，减少潜在的错误。在实际开发中，合理使用调用签名，可以帮助开发者更好地管理函数类型，提高代码的灵活性和复用性。
 */
// 1.函数类型表达式
type BarType = (num: number) => number

// 2.函数类型签名, 函数的调用签名(从对象的角度来看待这个函数, 也可以有其他属性)
interface IBar {
  name: string
  age: number
  // 函数可以调用: 函数调用签名
  (num1: number): number
}

const barFn: IBar = (num1: number): number => {
  return 123
}

barFn.name = "aaa"
barFn.age = 18
barFn(123)

// 3.调用签名
interface CallSign {
  (num: number): string
}

const callSignFn: CallSign = (num: number): string => {
  return "abc"
}

// 开发中如何选择:
// 1.如果只是描述函数类型本身(函数可以被调用), 使用函数类型表达式(Function Type Expressions)
// 2.如果在描述函数作为对象可以被调用, 同时也有其他属性时, 使用函数调用签名(Call Signatures)

export {}
